import os
import pandas as pd
import pymysql
from pprint import pprint
import unittest

# todo 文本操作
# todo 文本格式的数据 csv(,) tsv(\t) txt(自定义分割符）
# 读取数据
# data = pd.read_csv(路径， sep='分隔符'）
# data = pd.read_csv('data/lj_data.csv')  # 括号里是要读取文件的路径
# d1 = pd.read_excel('data/sales.xlsx')  # excel文件


# todo 查看前n行，默认查看前5行
# print(data.head())
# print(d1.head(6))
# todo 查看数据的形状，返回(行，列)
# print(data.shape)
# print(d1.shape)
# todo 查看字段名 (列名）
# print(data.columns)
# todo 查看索引, 索引从0开始
# print(data.index)
# print(d1.index)
# print(data.index.values)
# tsv(\t),txt,excel 操作同上

# todo 操作mysql, pd.read_sql(sql语句，con=连接对象）
# 创建连接对象
# conn = pymysql.connect(host='主机'（默认localhost）, user='用户名', password='密码',database='数据库', port=端口（默认3306）, charset='utf8')
# conn = pymysql.connect(host='localhost', user='root', password='111',database='news', port=3306, charset='utf8')
# 读取数据库
# print(pd.read_sql('select * from card_case', con=conn))
# print(pd.read_sql('select name from card_case', con=conn))

# todo dt.loc 方法，根据行、列标签查询
# print(data.loc[0]) # 行标签查询
# print(data.loc[0, '地址']) # 行列标签查询
# print(data.loc['户型']) # 不能根据单独的列标签查询
# print(data.loc[[0, 1, 3, 6], ['户型', '价格', '地址']]) # 行列标签查询

# todo dt.iloc 方法，i：index 根据行、列索引查询
# 行索引查询
# print(data.iloc[1])
# dt.iloc[行索引，列索引]行，列索引查询
# print(data.iloc[0, 1])
# dt.iloc[[行索引1, 行索引2, 行索引3, ...], [列索引1, 列索引2, 列索引3, ...]]
# print(data.iloc[[0, 2, 4], [0, 1, 3]])

# 将pd读取出的数据转化为列表字典
# l1 = []
# data.index.values 数据的所有行索引
# for i in data.index.values:
#     l1.append(data.loc[i].to_dict()) # data.loc[i] 根据行索引查询对应索引的所有信息，to_dict()

# 列表推导式
# l1 = [data.loc[i].to_dict for i in data.index.values]
# pprint(l1)

# 将pd读取出得数据转化为列表列表 [[], [], [], ...]
# pprint(data.iloc[[0, 1, 2, 3]].values.tolist())


# todo unittest 使用
# todo unittest.skip 跳过装饰器 使用
# todo assertEqual, assertNotEqual 断言
# todo 测试夹具
# setUpclass 属于类方法，在所有测试执行之前运行，只运行一次
# setUp 在每个测试方法运行前运行，运行n个测试方法就运行n次
# tearDown 在每个测试方法运行后运行，运行n个测试方法就运行n次
# tearDownClass 属于类方法，在所有测试执行后运行，只运行一次
# todo import unittest 导入unittest
class DemoTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('setUpClass')

    def setUp(self) -> None:
        print('setUp')

    def tearDown(self) -> None:
        print('teardown')

    def test01(self):
        print('test01')

    def test02(self):
        print('test02')

    def test03(self):
        print('test03')

    def test04(self):
        # assertEqual(a, b, msg='断言失败时打印的信息') a==b，则断言通过
        self.assertEqual(1, 1, msg='断言失败，测试用例不通过')
        print('4')

    def test05(self):
        # assertNotEqual(a, b, msg='断言失败时打印的信息') a!=b，则断言通过
        self.assertNotEqual(1, 2, msg='断言失败，测试用例不通过')
        print('5')

    # unittest.skip(reason)无条件跳过
    @unittest.skip('1') # 可填可不填
    def test06(self):
        print('test06')

    # unittest.skipIf(condition, reason) 条件为真时，跳过
    @unittest.skipIf(1==1, '跳过')
    def test07(self):
        print('test07')

    # unittest.skipUnless(condition, reason)条件为假时，跳过
    @unittest.skipUnless(1==2, 'skip')
    def test08(self):
        print('test08')

    # unittest.expectedFailure 预期该测试结果为失败，如果执行结果符合预期即为失败则跳过，不符合预期即执行结果为通过则不跳过
    @unittest.expectedFailure
    def test09(self):
        print('test09')

    @classmethod
    def tearDownClass(cls) -> None:
        print('tearDownClass')


if __name__ == '__main__':
    d = DemoTestCase()
    unittest.main(verbosity=2)
    # pycharm运行代码的方式不同，会影响结果的展示
    # tests 方式运行：verbosity的调整不会有效果
    # python 方式运行：verbosity的调整才会有效果

